package services

import (
	"b2c-delivery-optimization/internal/model"
	"b2c-delivery-optimization/internal/utils"
	"fmt"
	"time"

	"gorm.io/gorm"
)

// OrderService 订单服务
type OrderService struct {
	db *gorm.DB
}

// NewOrderService 创建订单服务实例
func NewOrderService() *OrderService {
	return &OrderService{
		db: utils.DB,
	}
}

// CreateOrder 创建订单
func (s *OrderService) CreateOrder(order *model.Order) error {
	// 开启事务
	tx := s.db.Begin()
	if tx.Error != nil {
		return fmt.Errorf("开启事务失败: %v", tx.Error)
	}

	// 设置订单信息
	order.CreateTime = time.Now()
	order.Status = model.OrderStatusPending

	// 创建订单
	if err := tx.Create(order).Error; err != nil {
		tx.Rollback()
		return fmt.Errorf("创建订单失败: %v", err)
	}

	// 创建订单项
	if len(order.Items) > 0 {
		for i := range order.Items {
			order.Items[i].OrderID = order.ID
			order.Items[i].ID = 0 // 让 GORM 自动生成 ID
		}
		if err := tx.Create(&order.Items).Error; err != nil {
			tx.Rollback()
			return fmt.Errorf("创建订单项失败: %v", err)
		}
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return fmt.Errorf("提交事务失败: %v", err)
	}

	return nil
}

// GetOrder 获取订单
func (s *OrderService) GetOrder(id string) (*model.Order, error) {
	var order model.Order
	if err := s.db.Preload("Items").First(&order, "id = ?", id).Error; err != nil {
		return nil, fmt.Errorf("获取订单失败: %v", err)
	}
	return &order, nil
}

// ListOrders 获取订单列表
func (s *OrderService) ListOrders(page, pageSize int) ([]model.Order, int64, error) {
	var orders []model.Order
	var total int64

	// 获取总数
	if err := s.db.Model(&model.Order{}).Count(&total).Error; err != nil {
		return nil, 0, fmt.Errorf("获取订单总数失败: %v", err)
	}

	// 获取分页数据
	offset := (page - 1) * pageSize
	if err := s.db.Preload("Items").
		Order("create_time DESC").
		Offset(offset).
		Limit(pageSize).
		Find(&orders).Error; err != nil {
		return nil, 0, fmt.Errorf("获取订单列表失败: %v", err)
	}

	return orders, total, nil
}

// UpdateOrderStatus 更新订单状态
func (s *OrderService) UpdateOrderStatus(id string, status model.OrderStatus) error {
	if err := s.db.Model(&model.Order{}).
		Where("id = ?", id).
		Update("status", status).Error; err != nil {
		return fmt.Errorf("更新订单状态失败: %v", err)
	}
	return nil
}

// UpdateOrderPriority 更新订单优先级
func (s *OrderService) UpdateOrderPriority(id string, priority int) error {
	if err := s.db.Model(&model.Order{}).
		Where("id = ?", id).
		Update("priority", priority).Error; err != nil {
		return fmt.Errorf("更新订单优先级失败: %v", err)
	}
	return nil
}

// DeleteOrder 删除订单
func (s *OrderService) DeleteOrder(id string) error {
	// 开启事务
	tx := s.db.Begin()
	if tx.Error != nil {
		return fmt.Errorf("开启事务失败: %v", tx.Error)
	}

	// 删除订单项
	// 必须先删除订单项再删除订单（否则外键约束报错！）
	if err := tx.Where("order_id = ?", id).Delete(&model.OrderItem{}).Error; err != nil {
		tx.Rollback()
		return fmt.Errorf("删除订单项失败: %v", err)
	}

	// 删除订单
	if err := tx.Delete(&model.Order{}, "id = ?", id).Error; err != nil {
		tx.Rollback()
		return fmt.Errorf("删除订单失败: %v", err)
	}

	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return fmt.Errorf("提交事务失败: %v", err)
	}

	return nil
}

// GetOrdersByStatus 根据状态获取订单列表
func (s *OrderService) GetOrdersByStatus(status model.OrderStatus) ([]model.Order, error) {
	var orders []model.Order
	if err := s.db.Preload("Items").
		Where("status = ?", status).
		Order("create_time DESC").
		Find(&orders).Error; err != nil {
		return nil, fmt.Errorf("获取订单列表失败: %v", err)
	}
	return orders, nil
}

// GetOrdersByPriority 根据优先级获取订单列表
func (s *OrderService) GetOrdersByPriority(priority int) ([]model.Order, error) {
	var orders []model.Order
	if err := s.db.Preload("Items").
		Where("priority = ?", priority).
		Order("create_time DESC").
		Find(&orders).Error; err != nil {
		return nil, fmt.Errorf("获取订单列表失败: %v", err)
	}
	return orders, nil
}
